#include "Projetil.h"

namespace td{
namespace projetil{

Projetil::Projetil(float posX, float posY, float posZ,int velocidadeDeDeslocamento, char* modelo, char* textura,
				   bool influenciaLuz, ISceneManager *cena): atirando(false), velocidadeDeslocamento(velocidadeDeDeslocamento){


	this->modelo = new Gerenciador3D(posX, posY, posZ, modelo, textura, influenciaLuz, false, cena);
	alvo = NULL;
	temporizador = clock();
}

Projetil::~Projetil(void){
}

void Projetil::setPosicao(float posX, float posY, float posZ){

	modelo->setPosicao(posX, posY, posZ);
}

void Projetil::ativarProjetil(float posicaoInicialX, float posicaoInicialY, float posicaoInicialZ, 
						 Inimigo *i, ISceneManager *cena){
	 atirando = true;
	 modelo->setVisibilidade(true);
	 alvo = i;
	 modelo->setPosicao(posicaoInicialX, posicaoInicialY, posicaoInicialZ);
	 this->cena = cena;
}

void Projetil::seguirAlvo(){
	modelo->setRotacao(0.1,0.1,0.1);
	if(((clock() - temporizador) / CLOCKS_PER_SEC) >= 0.1){
		temporizador = clock();

		double distancia = modelo->nodo->getPosition().getDistanceFrom(alvo->getModelo()->nodo->getPosition());

		ISceneNodeAnimator *anim = cena->createFlyStraightAnimator(
			vector3df(modelo->getPosicaoX(),modelo->getPosicaoY(), modelo->getPosicaoZ()), 
			vector3df(alvo->getModelo()->getPosicaoX(), alvo->getModelo()->getPosicaoY() + 5, alvo->getModelo()->getPosicaoZ()), (distancia * 10) - (velocidadeDeslocamento), false);//
		
		if (modelo->nodo->getAnimators().getSize() > 0){
			modelo->nodo->addAnimator(anim);
		}else{
			modelo->nodo->removeAnimators();
			modelo->nodo->addAnimator(anim);
		}
	}
	if(modelo->getPosicaoX() == alvo->getModelo()->getPosicaoX() &&
		   modelo->getPosicaoY() == alvo->getModelo()->getPosicaoY() &&
		   modelo->getPosicaoZ() == alvo->getModelo()->getPosicaoZ()){
			   modelo->setVisibilidade(false);
	}
	if(&alvo == NULL){
		atirando = false;
		modelo->setVisibilidade(false);
	}
}

bool Projetil::verificarColisao(){ 

	if(modelo->nodo->getTransformedBoundingBox().intersectsWithBox(alvo->getModelo()->nodo->getTransformedBoundingBox())){
		modelo->setVisibilidade(false);
		atirando = false;
		modelo->setPosicao(9999,9999,9999);
		return true;
	}else{
		return false;
	}
	
}

Inimigo* Projetil::getAlvo(void){

	return alvo;
}


Gerenciador3D* Projetil::getModelo(void){

	return modelo;
}

bool Projetil::getAtirando(void){
	return atirando;
}

void Projetil::setAtirando(bool atirando){
	this->atirando = atirando;
}



}
}